#ifndef MINISTERIO_H
#define MINISTERIO_H

#include "hotel.h"

class Ministerio
{
    public:
        Ministerio();
        Ministerio(const Lista<Provincia>& ps);

        Lista<Provincia> secretarias() const;
        Lista<Hotel> registro(const Provincia p) const;
        Lista<Lista<Hotel> > cadenasDeHoteles() const;

        void agregarHotel(const Hotel& h, const Provincia p);
        Lista<Cadena> cadenasAmarretas() const;
        void fusionAutorizada(const Cadena c1, const Cadena c2);
        bool operator==(const Ministerio& m) const;

        void mostrar(std::ostream& os) const;
		void guardar(std::ostream& os) const;
		void cargar (std::istream& is);

    private:
        Lista<Provincia> _provincias;
        Lista<pair<Provincia, Hotel> > _registro;
        Lista<Hotel> listarhoteles(Cadena c, Lista<Hotel> hs) const;
        enum {ENCABEZADO_ARCHIVO = 'M'};
        Lista<Hotel> todoshoteles() const;
        Lista<Cadena> listaCadenas(Lista<Hotel> hs) const;
        Lista<Hotel> sacarRepes(Lista<Hotel> hs) const;
        template<class T> bool mismos(const Lista<T>& l1, const Lista<T>& l2) const;
        Lista<Provincia> dameprovs(Lista<Hotel> hs) const;
        Provincia prov(Hotel h) const;
        Lista<pair<TipoHabitacion, Dinero> > tipoHabitacionXDinero(Hotel hotel);
        Lista<pair<Accesorio, Dinero> > accesoriosPorDinero(Hotel hotel);
        Lista<Hotel> getHoteles() const;
        Lista<Lista<Hotel> > agregarHotel(const Hotel hotel, const Lista<Lista<Hotel> > cadenas) const;
};

std::ostream & operator<<(std::ostream & os,const Ministerio & m);

#endif // MINISTERIO_H
